package com.cc.od.candy;
/*
@description:
                        题目描述：抓糖果
                        小明从糖果盒中随意抓一把糖果，每次小明会取出一半的糖果分给同学们。当糖果不能平均分配时，小明可以选择从糖果盒中（假设盒中糖果足够）取出一个糖果或放回一个糖果。小明最少需要多少次（取出、放回和平均分配均记一次），能将手中糖果分至只剩一个。

                        输入描述：
                        一个整数n，表示小明最初抓取的糖果数（n小于某个上限，如1000000或10000000000）。

                        输出描述：
                        输出小明最少需要多少次操作能将手中糖果分至只剩一个。

                        解题思路：

                        理解题意：首先明确，每次操作包括取出糖果、放回糖果和平均分配糖果三个步骤中的任意一个或多个，且均记作一次操作。

                        数学分析：为了最小化操作次数，我们希望每次都能尽量平均分配糖果，减少因不能平均分配而需要额外操作的情况。一个直观的思路是，如果糖果总数是偶数，则直接平均分配；如果是奇数，则通过增加或减少一个糖果使其成为偶数，再进行平均分配。

                        动态规划或贪心策略：虽然此题看似可以通过简单的数学变换和迭代解决，但在面对大数据量时，可能需要采用更高效的算法，如动态规划或贪心算法来优化计算过程。然而，对于本题而言，由于每次操作都可以直接基于当前糖果数量进行调整，因此贪心策略（即每次尽可能平均分配）往往是有效的。

                        特殊情况处理：当糖果数量很少时（如1或2），需要特殊处理以避免无效操作。

                        编程实现：根据以上思路，编写代码实现算法。注意处理边界条件和异常情况。

                        示例：
                        输入：15
                        输出：5
                        解释：
                        15+1=16（因为15是奇数，所以加1变为偶数）
                        16/2=8
                        8/2=4
                        4/2=2
                        2/2=1
                        共进行5次操作。
@ClassName CandyDistribution
@author chen
@create 2024-09-30 16:21
@Version 1.0
*/
public class CandyDistribution {

    public static void main(String[] args) {
        int n = 15;
        System.out.println("最少需要 " + minOperationsToSingleCandy(n) + " 次操作。");
    }
    public static int minOperationsToSingleCandy(int n)
    {
        // 初始化操作次数为 0
        int steps = 0;
        // 当糖果数量大于 1 时，继续执行操作
        while (n > 1)
        {
            // 如果糖果数量为奇数，执行+1操作
            if (n % 2 == 1)
            {
                n++;
                // 累计操作次数
            }
            else
            {
                // 偶数直接除以 2
                n /= 2;
                // 累计操作次数
            }
            steps++;
        }
        // 返回最终的操作次数
        return steps;
    }
}
